home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル応用編
/
簡易エディタ
/
SESCROLL.C
< prev
Wrap
Text File
|
1994-03-10
|
8KB
|
233 lines
/******************************************************************************
* sescroll.c: スクロール関係の関数
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include "sedit.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* createScrollBar(): スクロールバーを作成する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗
*/
BOOLEAN createScrollBar(ComVal *pcv)
{
Rect rcH, rcV;
/* スクロールバーの位置を計算する */
pcv->scrlH.val = 0;
pcv->scrlH.max = 0;
pcv->scrlH.dMax = 0;
pcv->scrlV.val = 0;
pcv->scrlV.max = 0;
pcv->scrlV.dMax = 0;
/* スクロールバーの位置と大きさを計算する */
rcH = rcV = pcv->windowPtr->graph.rect;
rcH.d.top = rcH.d.bottom - SCRLBR_H;
rcH.d.right -= SCRLBR_H;
rcV.d.left = rcV.d.right - SCRLBR_H;
rcV.d.bottom -= SCRLBR_H;
pcv->scrlBrHHdl = CMOpen(pcv->windowPtr, &rcH,
NONTITLE, TRUE, 0, 0, 0, CI_SCLBRWH << 4, 0);
if (pcv->scrlBrHHdl == NULL)
return FALSE;
pcv->scrlBrVHdl = CMOpen(pcv->windowPtr, &rcV,
NONTITLE, TRUE, 0, 0, 0, CI_SCLBRWV << 4, 0);
if (pcv->scrlBrVHdl == NULL)
return FALSE;
return TRUE;
}
/******************************************************************************
* checkScrollBar(): スクロールバーのパートごとの処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: int パートコード
*/
int checkScrollBar(ComVal *pcv)
{
int partCode; /* コントロールのパートコード */
int sig = 1; /* スクロールの方向(1 / -1) */
long offset[2];
LPoint lpt;
Control **ctrlHdl; /* コントロールハンドル */
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
/* テキストエディットをアップデートする */
TMUpDateExist(pcv->tEditHdl, 1);
/* 現在のオフセット値を取得する */
TMGetDestOffset(pcv->tEditHdl, offset);
/* ポインタ座標をローカル座標系に変換する */
lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
partCode = CMFind(lpt, pcv->windowPtr, &ctrlHdl);
switch(partCode) {
case C_INTHUMB: /* スクロールボックス */
CMCheck(ctrlHdl, lpt, NULL);
if (ctrlHdl == pcv->scrlBrHHdl)
offset[0] = CMValueGet(ctrlHdl);
else if (ctrlHdl == pcv->scrlBrVHdl)
offset[1] = CMValueGet(ctrlHdl) * (1 << pcv->scrlShift);
break;
case C_INUP: /* スクロールアップボタン */
sig = -1;
/* この処理は下に続きます */
case C_INDOWN: /* スクロールダウンボタン */
/* SHIFTキーが押されてないか? */
if (!(pcv->event.ev.how & KS_SHIFT)) {
if (ctrlHdl == pcv->scrlBrHHdl) {
/* 横8文字分スクロール */
offset[0] += FONTSIZE * 8 * sig;
if (offset[0] < 0)
offset[0] = 0;
else if (offset[0] > CMMaxGet(ctrlHdl))
offset[0] = CMMaxGet(ctrlHdl);
} else if (ctrlHdl == pcv->scrlBrVHdl)
/* 縦3行分スクロール */
offset[1] += (*pcv->tEditHdl)->lineHeight * 3 * sig;
break;
}
/* この処理は下に続きます */
case C_INPGUP: /* ページスクロールアップボタン */
if (partCode == C_INPGUP)
sig = -1;
/* この処理は下に続きます */
case C_INPGDOWN: /* ページスクロールダウンボタン */
if (ctrlHdl == pcv->scrlBrHHdl) {
/* 横表示桁数分スクロール */
offset[0] += ((*pcv->tEditHdl)->view.d.right
- (*pcv->tEditHdl)->view.d.left) * sig;
if (offset[0] < 0)
offset[0] = 0;
else if (offset[0] > CMMaxGet(ctrlHdl))
offset[0] = CMMaxGet(ctrlHdl);
} else if (ctrlHdl == pcv->scrlBrVHdl)
/* 縦表示行数分スクロール */
offset[1] += ((*pcv->tEditHdl)->view.d.bottom
- (*pcv->tEditHdl)->view.d.top) * sig;
break;
default:
return 0;
}
/* テキストエディットをスクロールさせる */
TMSetDestOffset(pcv->tEditHdl, offset[0], offset[1]);
setScrollBar(pcv);
return partCode;
}
/******************************************************************************
* setScrollBar(): スクロールバーに値を設定する
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void setScrollBar(ComVal *pcv)
{
ScrlVal svH, svV;
/* スクロールバーの現在値、最大値を算出する */
calcScrollBar(pcv, &svH, &svV);
if (svH.val != pcv->scrlH.val || svH.max != pcv->scrlH.max
|| svH.dMax != pcv->scrlH.dMax) { /* 値に変更があるか? */
/* コントロール定義関数のデータを設定する */
CMDefDataSet(pcv->scrlBrHHdl, LONGWORD(1, svH.dMax));
CMMaxSet(pcv->scrlBrHHdl, svH.max);
CMValueSet(pcv->scrlBrHHdl, svH.val);
pcv->scrlH = svH;
}
if (svV.val != pcv->scrlV.val || svV.max != pcv->scrlV.max
|| svV.dMax != pcv->scrlV.dMax) { /* 値に変更があるか? */
/* コントロール定義関数のデータを設定する */
CMDefDataSet(pcv->scrlBrVHdl, LONGWORD(1, svV.dMax));
CMMaxSet(pcv->scrlBrVHdl, svV.max);
CMValueSet(pcv->scrlBrVHdl, svV.val);
pcv->scrlV = svV;
}
}
/******************************************************************************
* calcScrollBar(): スクロールバーの現在値、最大値の算出
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* ScrlVal *pvalh 横スクロールバーの値を格納するポインタ
* ScrlVal *pvalv 縦スクロールバーの 〃
*/
void calcScrollBar(ComVal *pcv, ScrlVal *pvalh, ScrlVal *pvalv)
{
int edit, view, off, shift = 0;
TEdit *ptEdit = *pcv->tEditHdl;
/* 縦方向のスクロール */
edit = ptEdit->nLines * ptEdit->lineHeight; /* 全体の行数 */
/* テキスト先頭から表示の最下位行までの行数 */
off = ptEdit->view.d.bottom - ptEdit->offsetV;
edit = (edit < off) ? off : edit; /* 全体行数を補正する */
/* edit が 0x3f00 以下になるまで右シフトする */
while (edit > 0x3f00) {
edit >>= 1;
shift++; /* シフト回数をカウントする */
}
pvalv->dMax = edit; /* コントロール定義関数のデータ */
pcv->scrlShift = shift;
/* 最大値を計算する */
view = ptEdit->view.d.bottom - ptEdit->view.d.top;
view >>= shift; /* edit と同じ回数右シフトする */
pvalv->max = edit - view;
/* 現在値を計算する */
view = ptEdit->view.d.top - ptEdit->offsetV;
view >>= shift; /* edit と同じ回数右シフトする */
pvalv->val = view;
/* 横方向のスクロール */
edit = ptEdit->dest.d.right - ptEdit->dest.d.left;
off = ptEdit->view.d.right - ptEdit->offsetH;
edit = (edit < off) ? off : edit; /* 全体行数を補正する */
/* 全体桁数(コントロール定義関数で使用)*/
pvalh->dMax = edit;
/* 最大値を計算する */
view = ptEdit->view.d.right - ptEdit->dest.d.left;
pvalh->max = edit - view;
/* 現在値を計算する */
pvalh->val = ptEdit->dest.d.left - ptEdit->offsetH;
}
/******************************************************************************
* resizeScrollBar(): スクロールバーのサイズ変更
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void resizeScrollBar(ComVal *pcv)
{
Rect rcH, rcV;
/* スクロールバーの位置と大きさを計算する */
rcH = rcV = pcv->windowPtr->graph.rect;
rcH.d.top = rcH.d.bottom - SCRLBR_H;
rcH.d.right -= SCRLBR_H;
rcV.d.left = rcV.d.right - SCRLBR_H;
rcV.d.bottom -= SCRLBR_H;
CMHide(pcv->scrlBrHHdl); /* スクロールバーを消去する */
CMHide(pcv->scrlBrVHdl);
CMMove(pcv->scrlBrHHdl, rcH.l.l_t);
CMSize(pcv->scrlBrHHdl, LONGWORD(rcH.d.right - rcH.d.left, SCRLBR_H));
CMMove(pcv->scrlBrVHdl, rcV.l.l_t);
CMSize(pcv->scrlBrVHdl, LONGWORD(SCRLBR_H, rcV.d.bottom - rcV.d.top));
CMShow(pcv->scrlBrHHdl); /* スクロールバーを表示する */
CMShow(pcv->scrlBrVHdl);
}